package com.ydgk.servlet;

import com.alibaba.fastjson.JSON;
import com.mysql.jdbc.Connection;
import com.ydgk.bean.*;
import com.ydgk.db.JDBCUtils;
import com.ydgk.service.*;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Date;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

@WebServlet(name = "CommServlet", urlPatterns = "/CommServlet.action")
public class CommServlet extends BaseServlet {
    // 上传文件存储目录
    private static final String UPLOAD_DIRECTORY = "D:/img";
    // 上传配置
    private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3;  // 3MB
    private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
    private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB

    protected void deleteById(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        CommService commService = new CommService();
        int cid= Integer.parseInt(request.getParameter("cid"));
        int i =commService.deleteById(cid);
        if(i>0){
            this.findAll(request,response);
        }
    }

    protected void proFindAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        ProviderService providerService = new ProviderService();

        List<Provider> all = providerService.findAll();
        response.getWriter().print(JSON.toJSONString(all));
    }

    protected void save(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext application = request.getServletContext();
        PrintWriter out = response.getWriter();
        // 检测是否为多媒体上传,如果没有就不用做后续的处理了
        if (!ServletFileUpload.isMultipartContent(request)) {
            // 如果不是则停止
            out.println("<script>alert('Error: 表单必须包含 enctype=multipart/form-data');window.history.back();</script>");
            out.flush();
            return;
        }
        // 配置上传参数
        DiskFileItemFactory factory = new DiskFileItemFactory();

        // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
        factory.setSizeThreshold(MEMORY_THRESHOLD);

        // 设置临时存储目录
        factory.setRepository(new File(System.getProperty("java.io.tmpdir")));

        //ServletFileUpload就是用户获取用户提交上来的文件信息,还有表单中的文本信息
        ServletFileUpload upload = new ServletFileUpload(factory);

        // 设置最大文件上传值
        upload.setFileSizeMax(MAX_FILE_SIZE);

        // 设置最大请求值 (包含文件和表单数据)
        upload.setSizeMax(MAX_REQUEST_SIZE);

        // 中文处理
        upload.setHeaderEncoding("UTF-8");

        // 构造临时路径来存储上传的文件
        // 这个路径相对当前应用的目录
        String uploadPath = UPLOAD_DIRECTORY;

        // 如果目录不存在则创建
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();//建upload文件
        }

        Commodity commodity = new Commodity();

        try {
            //将request对象进行转换.,转换成FileItem集合
            List<FileItem> list = upload.parseRequest(request);
            for (FileItem fileItem : list) {
                //isFormField()如果是true就是普通文本内容,如果是false的话就是要上传的文件
                if (fileItem.isFormField()) {
                    //文本处理
                    String value = fileItem.getString("utf-8");
                    BeanUtils.setProperty(commodity, fileItem.getFieldName(), value);
                } else {
                    if (fileItem.getSize() > 0) {

                        //文件上传
                        String fileName = fileItem.getName(); //上传的文件名字

                        int index = fileName.lastIndexOf(".");
                        String newfilename = Math.random() + fileName.substring(index);

                        //c:/xxx/xxx/xxx/xxx/upload/123. gif
                        File f = new File(uploadPath + "/" + newfilename);
                        // 保存文件到硬盘
                        fileItem.write(f);//文件写入

                        //保存到数据库的图片路径是相对路径,不能用绝对路径
                        commodity.setCface( "myimg/" + newfilename);
                    }
                }
            }

            CommService commService = new CommService();

            int i = commService.save(commodity);

            if(i>0){
                //out.print("<script language=\"javascript\">window.opener=null;window.close();</script>");
                this.findAll(request,response);
            }else{
                response.getWriter().print("操作失败");
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    protected void updateById(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        int cid=Integer.parseInt(request.getParameter("cid"));
        int cprice=Integer.parseInt(request.getParameter("cprice"));
        int cprovider =Integer.parseInt(request.getParameter("cprovider"));
        CommService commService = new CommService();
        Commodity commodity=new Commodity();
        commodity.setCid(cid);
        commodity.setCprice(cprice);
        commodity.setCprovider(cprovider);
        int i=commService.updateById(commodity);
        response.getWriter().print(i>0?"true":"false");
    }

    protected void findAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        CommService commService=new CommService();
        List<Commodity> commodityList= commService.findAll();
        request.setAttribute("commodityList",commodityList);
        request.setAttribute("mainPage","commodityFindAll.jsp");
        request.getRequestDispatcher("index.jsp").include(request,response);
    }

    protected void buy(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        HttpSession session = request.getSession();
        PrintWriter pw=response.getWriter();

        if(session.getAttribute("user")==null){
            pw.write("<script language='javascript'>alert('请先登录')</script>");
            request.getRequestDispatcher("login.jsp").forward(request,response);
        }
        int uid=0;
        int cid=0;
        int cprovider=0;
        int money=0;
        try{
             uid= Integer.parseInt(request.getParameter("uid"));
             cid= Integer.parseInt(request.getParameter("cid"));
             cprovider= Integer.parseInt(request.getParameter("cprovider"));
             money=Integer.parseInt(request.getParameter("num"));
        }catch (NumberFormatException e){

        }
        CommService commService=new CommService();
        UserService userService=new UserService();
        ProviderService providerService=new ProviderService();
        User user=userService.findById(uid);
        Provider provider=providerService.findById(cprovider);
        try {
            java.sql.Connection conn= JDBCUtils.getConnection();
            Commodity commodity = commService.findById(cid);
            conn.setAutoCommit(false);//取消自动提交
            if(user.getMoney()>money){
            int price=commodity.getCprice();
            int num=money/price;
            int i=userService.updatemoney(user,money);//用户金钱减少
            int j=providerService.updatemoney(provider,money);//供应商金钱增加
            int k=commService.updateCnum(num,cid);//商品数量减少
            int last=user.getMoney();
                System.out.println("出错了");
                if(i>0&&j>0&&k>0){
                    pw.write("<script language='javascript'>alert('购买成功')</script>");
                    BillService billService=new BillService();
                    Bill bill = new Bill();
                    bill.setBname(commodity.getCname());
                    bill.setBcnum(num);
                    bill.setBcomm(cid);
                    bill.setBprice(money);
                    bill.setBprovider(provider.getPid());
                    bill.setBdate(new Date(System.currentTimeMillis()));
                    billService.save(bill);
                    conn.commit();//满足则提交
                    conn.close();
                }else{
                    pw.write("<script language='javascript'>alert('购买失败')</script>");
                    conn.rollback();//不满足就回滚
                    conn.close();
                }
            }else{
                pw.write("<script language='javascript'>alert('余额不足')</script>");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        List<Commodity> commodityList= commService.findAll();
        request.setAttribute("commodityList",commodityList);
        request.setAttribute("mainPage","commodityFindAll.jsp");
        request.getRequestDispatcher("index.jsp").include(request,response);
    }

    protected void typeFindAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        TypeService typeService = new TypeService();
        List<Type> all = typeService.findAll();
        response.getWriter().print(JSON.toJSONString(all));
    }

}
